#include <iostream>
using std::cout;
using std::endl;

template<typename T>
void printT(T &t)
{
    cout << "lvalue" << endl;
}

template<typename T>
void printT(T && t)
{
   cout << "rvalue" << endl;
}

template <typename T>
void TestForward(T && v)
{
    printT(v);
    printT(std::forward<T>(v));
    printT(std::move(v));
}

template<class Function, class... Args>
    inline auto FuncWrapper(Function &&f, Args &&... args) 
-> decltype(f(std::forward<Args>(args)...))
{
    return f(std::forward<Args>(args)...);
}
int main(void)
{
    TestForward(1);
    cout << "==================" << endl;
    int x = 1;
    TestForward(x);
    cout << "==================" << endl;
    TestForward(std::forward<int>(x));

    return 0;
}

//当一个右值引用作为函数的形参，在函数内部再转发该函数时，它已经变成一个左值，并不是原来的类型。
//我们需要一种方式，将参数原来的类型转发到另一个函数，这种转发被称为完美转发。
//实现这一方式就是在函数传递前，调用另外一个函数模板`std::forward<>()`
